This page has been superceded by a wiki version of this example: CurrencyUsingWithExample
/*
Title: Currency with Operator Overloading (using "with")
File: with.d
Author: J C Calvarese, http://jcc_7.tripod.com/d/
Date: 2004/01/03
Licence: Public domain
TEST version: outputs more information to the console during run.
*/
import std.string;
import std.math;
char[] leadingZeros(byte num, byte digits)
/* by J C Calvarese, also in locales2.d */
{
char[] buffer;
byte diff;
buffer = toString(num);
if (buffer.length < digits)
{
diff = digits - buffer.length;
for(int i=0; i < diff; i++)
buffer = "0" ~ buffer;
}
return buffer;
}
char[] toStringFromDouble(double d)
{
return toStringFromDouble(d, 2); /* defaults to 2 decimal places */
}
char[] toStringFromDouble(double d, int decPlaces)
{
return toStringFromDouble(d, decPlaces, "."); /* separator defaults to period */
}
char[] toStringFromDouble(double i, int decPlaces, char[] sep)
{
int whole;
int dec;
double decPart;
whole = cast(int) i;
version(TEST) printf("whole: %d\n", whole);
decPart = (i - whole) * pow(cast(real) 10, cast(uint) decPlaces);
version(TEST) printf("decPart: %lf\n", decPart);
dec = cast(int) (decPart);
version(TEST) printf("dec: %d\n", dec);
return toString(i) ~ sep ~ leadingZeros(dec, decPlaces);
}
class Currency
{
/* Read property ("get-ter") */
double value() {return intValue;}
/* Write property ("set-ter") */
double value(double v) {return intValue = v;}
this(double v)
{
version(TEST) printf("An instance of the Currency object is created.\n\n");
intValue = v;
intSeparator = ".";
intDecPlaces = 2;
}
this()
{
this(0);
}
char[] toString() { return toStringFromDouble(intValue, intDecPlaces, intSeparator);}
/* operator overloading */
Currency opAdd(Currency m, Currency n)
{
Currency t;
t.value = m.value + n.value;
return t;
}
Currency opAddAssign(Currency m)
{
intValue += m.value;
return this;
}
private
{
double intValue;
double intDecPlaces;
char[] intSeparator; /* decimal, period (U.S.), comma (Some non-U.S. locations) */
}
}
void main()
{
Currency c; // = new Currency();
with(c = new Currency())
{
printf("\n\n\t\t\t\t\t\t%.*s\n", toString);
printf("Change the value\t\t\t\t");
value = 100.75;
printf("%.*s\n", toString);
}
Currency c2;
with(c2 = new Currency(26.12))
{
printf("\t\t\t\t\t\t%.*s\n", toString);
printf("Change the value\t\t\t\t");
value = 6.25;
printf("%.*s\n", toString);
printf("Change the value (operator overloading)\t\t");
c2 += c; /* requires operator overloading */
printf("%.*s\n\n", toString);
}
}